/**********************************************************************************************/
// dgt_LogicTable.cpp
//
// Common Lib for Digital Studio
// Block of management of bool functions
// Class of logic table
//
// Copyright Diamant Group 2008
/**********************************************************************************************/
#include "dgt_LogicTable.h"
#include "dgt_Utils.h"
#include "math.h"
#include <wx/arrimpl.cpp>

/**********************************************************************************************/
WX_DEFINE_OBJARRAY( dgt_LogTableArray );

/**********************************************************************************************/
dgt_LogicTable::dgt_LogicTable( )
: m_VarCount(0)
, m_ValuesCount(0)
{

}

/**********************************************************************************************/
dgt_LogicTable::dgt_LogicTable( wxArrayString &inVarNames )
{
	set_VarNames( inVarNames );
	set_EmptyValues( m_ValuesCount );
}

/**********************************************************************************************/
dgt_LogicTable::dgt_LogicTable( wxArrayString &inVarNames,
								map<unsigned,bool> inValues )
{
	set_VarNames( inVarNames );
	set_Values( inValues );
}

/**********************************************************************************************/
void dgt_LogicTable::set_VarNames( wxArrayString &inVarNames )
{
	m_VarCount = inVarNames.Count();
	m_ValuesCount = pow( (double)2, static_cast<double>(m_VarCount));

	for( unsigned i = 0; i < inVarNames.Count(); i++ )
		m_VarNames.Add( inVarNames.Item( i ) );
}

/**********************************************************************************************/
void dgt_LogicTable::set_VarName( unsigned inIndex, wxString &inVarName )
{
	wxArrayString t_Array;
	for( unsigned i = 0; i < m_VarCount; i++ )
		t_Array.Add( m_VarNames.Item( i ) );

	m_VarNames.Clear();
	for( unsigned i = 0; i < m_VarCount; i++ )
	{
		if( i == inIndex )
			m_VarNames.Add( inVarName );
		else
			m_VarNames.Add( t_Array.Item( i ));
	}
}

/**********************************************************************************************/
wxString dgt_LogicTable::get_VarName( unsigned inIndex )
{
	return m_VarNames.Item( inIndex );
}

/**********************************************************************************************/
void dgt_LogicTable::set_Values( map<unsigned, bool> inValues )
{
	map<unsigned, bool> tVal = inValues;
	for( map<unsigned, bool>::const_iterator p = tVal.begin(); p != tVal.end(); p++ )
		if( (p->first >= m_ValuesCount)  || (p->first < 0) )	// Excess of a range
			tVal.erase( p->first );

	m_Values = tVal;
}


/**********************************************************************************************/
void dgt_LogicTable::set_Value( unsigned inIndex, bool inValue )
{
	if(( inIndex < m_ValuesCount ) && ( inIndex ) )			// Excess of a range
		m_Values[ inIndex ] = inValue;
}

/**********************************************************************************************/
bool dgt_LogicTable::get_Value( unsigned inIndex )
{
	bool result = false;
	map<unsigned, bool>::const_iterator p = m_Values.find( inIndex );

	if( p!=m_Values.end() )
		result = p->second;
	else
		result = false;

	return result;
}

/**********************************************************************************************/
void dgt_LogicTable::set_Value( wxBoolArray inIndex, bool inValue )
{
	unsigned t_Index = get_NumFromBits( inIndex );

	set_Value( t_Index, inValue );
}

/**********************************************************************************************/
bool dgt_LogicTable::get_Value( wxBoolArray inIndex )
{
	return false;
}

/**********************************************************************************************/
void dgt_LogicTable::DeleteVar( unsigned inIndex, bool inValuetoReplace )
{

}

/**********************************************************************************************/
void dgt_LogicTable::AddVar( wxString inName, bool inValuetoFill )
{

}

/**********************************************************************************************/
void dgt_LogicTable::set_EmptyValues( unsigned count )
{
	for( unsigned i = 0; i < count; i++ )
		m_Values[ i ] = false;
}



